/**
 * 单据状态类型定义
 */
export type BillStatus = {
    /** 审核状态 */
    auditStatus: string;
    /** 审批状态 */
    approvalStatus: string;
    /** 是否可编辑 */
    editable: boolean;
    /** 是否可查看 */
    viewable: boolean;
    /** 是否可审核 */
    auditable: boolean;
    /** 是否可作废 */
    voidable: boolean;
}

/**
 * 审核状态
 * PENDING: 单据内容一般是允许修改、明细允许修改，允许操作审核或发起审批
 * AUDITED: 单据内容仅允许查看不允许修改，其他操作都不可再操作
 * VOIDED: 单据内容仅允许查看不允许修改，其他操作都不可再操作
 */
export const AUDIT_STATUS = {
    /** 尚未审核 - 允许修改、允许审核、允许作废 */
    PENDING: '尚未审核',
    /** 已审核 - 仅允许查看，不可修改和其他操作 */
    AUDITED: '已审核',
    /** 已作废 - 仅允许查看，不可修改和其他操作 */
    VOIDED: '已作废'
} as const;

/**
 * 审批状态
 * PENDING: 单据内容一般是允许修改、明细允许修改，允许操作审核或发起审批
 * REJECTED: 单据内容一般是允许修改、明细允许修改，允许操作审核或发起审批
 * APPROVED: 单据内容仅允许查看不允许修改，允许操作审核，查看审批情况
 * IN_PROGRESS: 单据内容仅允许查看不允许修改，仅允许查看审批情况
 */
export const APPROVAL_STATUS = {
    /** 尚未审批 - 允许修改、允许审核、允许作废 */
    PENDING: '尚未审批',
    /** 审批未通过 - 允许修改、允许审核、允许作废 */
    REJECTED: '审批未通过',
    /** 审批已通过 - 仅允许查看和审核，不可修改和作废 */
    APPROVED: '审批已通过',
    /** 正在审批 - 仅允许查看，不可修改和其他操作 */
    IN_PROGRESS: '正在审批'
} as const;

/**
 * 获取单据状态控制
 * @param auditStatus 审核状态
 * @param approvalStatus 审批状态
 * @returns 状态控制对象
 */
export function getBillStatus(auditStatus: string, approvalStatus: string): BillStatus {
    // 已作废状态
    if (auditStatus === AUDIT_STATUS.VOIDED) {
        return {
            auditStatus,
            approvalStatus,
            editable: false,
            viewable: true,
            auditable: false,
            voidable: false
        };
    }

    // 已审核状态
    if (auditStatus === AUDIT_STATUS.AUDITED) {
        return {
            auditStatus,
            approvalStatus,
            editable: false,
            viewable: true,
            auditable: false,
            voidable: false
        };
    }

    // 尚未审核状态下的各种审批状态处理
    if (auditStatus === AUDIT_STATUS.PENDING) {
        switch (approvalStatus) {
            // 尚未审批
            case APPROVAL_STATUS.PENDING:
                return {
                    auditStatus,
                    approvalStatus,
                    editable: true,
                    viewable: true,
                    auditable: true,
                    voidable: true
                };

            // 审批未通过
            case APPROVAL_STATUS.REJECTED:
                return {
                    auditStatus,
                    approvalStatus,
                    editable: true,
                    viewable: true,
                    auditable: true,
                    voidable: true
                };

            // 正在审批
            case APPROVAL_STATUS.IN_PROGRESS:
                return {
                    auditStatus,
                    approvalStatus,
                    editable: false,
                    viewable: true,
                    auditable: false,
                    voidable: false
                };

            // 审批已通过
            case APPROVAL_STATUS.APPROVED:
                return {
                    auditStatus,
                    approvalStatus,
                    editable: false,
                    viewable: true,
                    auditable: true,
                    voidable: false
                };
        }
    }

    // 默认状态
    return {
        auditStatus,
        approvalStatus,
        editable: false,
        viewable: true,
        auditable: false,
        voidable: false
    };
}

/**
 * 获取审核状态列表
 */
export function getAuditStatusList() {
    return Object.values(AUDIT_STATUS).map(value => ({
        label: value,
        value: value
    }));
}

/**
 * 获取审批状态列表
 */
export function getApprovalStatusList() {
    return Object.values(APPROVAL_STATUS).map(value => ({
        label: value,
        value: value
    }));
}

/**
 * 判断是否为有效的审核状态
 */
export function isValidAuditStatus(status: string): boolean {
    return Object.values(AUDIT_STATUS).includes(status);
}

/**
 * 判断是否为有效的审批状态
 */
export function isValidApprovalStatus(status: string): boolean {
    return Object.values(APPROVAL_STATUS).includes(status);
}

/**
 * 使用示例：
 *
 * 1. 导入所需的内容
 * import {
 *   AUDIT_STATUS,
 *   APPROVAL_STATUS,
 *   getBillStatus,
 *   getAuditStatusList,
 *   getApprovalStatusList,
 *   isValidAuditStatus,
 *   isValidApprovalStatus,
 *   type BillStatus
 * } from '@/pages/BusiViews/utils/states';
 *
 * 2. 获取单据状态控制
 * // 假设从接口获取状态
 * const auditStatus = '尚未审核';
 * const approvalStatus = '正在审批';
 *
 * const billStatus = getBillStatus(auditStatus, approvalStatus);
 * console.log(billStatus);
 * // 输出:
 * // {
 * //   auditStatus: '尚未审核',
 * //   approvalStatus: '正在审批',
 * //   editable: false,
 * //   viewable: true,
 * //   auditable: false,
 * //   voidable: false
 * // }
 *
 * 3. 在模板中使用状态控制
 * <template>
 *   <!-- 根据状态控制按钮显示 -->
 *   <button v-if="billStatus.editable">编辑</button>
 *   <button v-if="billStatus.auditable">审核</button>
 *   <button v-if="billStatus.voidable">作废</button>
 *
 *   <!-- 根据状态控制表单是否可编辑 -->
 *   <form :disabled="!billStatus.editable">
 *     <!-- 表单内容 -->
 *   </form>
 * </template>
 *
 * 4. 获取状态选项列表（用于下拉选择等）
 * const auditOptions = getAuditStatusList();
 * console.log(auditOptions);
 * // 输出:
 * // [
 * //   { label: '尚未审核', value: '尚未审核' },
 * //   { label: '已审核', value: '已审核' },
 * //   { label: '已作废', value: '已作废' }
 * // ]
 *
 * const approvalOptions = getApprovalStatusList();
 * console.log(approvalOptions);
 * // 输出:
 * // [
 * //   { label: '尚未审批', value: '尚未审批' },
 * //   { label: '审批未通过', value: '审批未通过' },
 * //   { label: '审批已通过', value: '审批已通过' },
 * //   { label: '正在审批', value: '正在审批' }
 * // ]
 *
 * 5. 验证状态是否有效
 * const isValidAudit = isValidAuditStatus('已审核'); // true
 * const isValidAuditWrong = isValidAuditStatus('错误状态'); // false
 *
 * const isValidApproval = isValidApprovalStatus('正在审批'); // true
 * const isValidApprovalWrong = isValidApprovalStatus('错误状态'); // false
 *
 * 6. 在组件中使用示例
 * <script setup lang="ts">
 * import { ref, computed } from 'vue';
 * import { getBillStatus, AUDIT_STATUS, APPROVAL_STATUS } from './states';
 *
 * // 状态数据
 * const auditStatus = ref(AUDIT_STATUS.PENDING);
 * const approvalStatus = ref(APPROVAL_STATUS.PENDING);
 *
 * // 计算状态控制
 * const billStatus = computed(() =>
 *   getBillStatus(auditStatus.value, approvalStatus.value)
 * );
 *
 * // 处理审核
 * const handleAudit = () => {
 *   if (!billStatus.value.auditable) {
 *     uni.showToast({ title: '当前状态不可审核' });
 *     return;
 *   }
 *   // 执行审核逻辑
 * };
 *
 * // 处理作废
 * const handleVoid = () => {
 *   if (!billStatus.value.voidable) {
 *     uni.showToast({ title: '当前状态不可作废' });
 *     return;
 *   }
 *   // 执行作废逻辑
 * };
 * </script>
 *
 * <template>
 *   <view>
 *     <text>审核状态：{{ auditStatus }}</text>
 *     <text>审批状态：{{ approvalStatus }}</text>
 *
 *     <button
 *       :disabled="!billStatus.editable"
 *       @click="handleEdit"
 *     >编辑</button>
 *
 *     <button
 *       :disabled="!billStatus.auditable"
 *       @click="handleAudit"
 *     >审核</button>
 *
 *     <button
 *       :disabled="!billStatus.voidable"
 *       @click="handleVoid"
 *     >作废</button>
 *   </view>
 * </template>
 */
